package plp.imperative1.command;

import plp.expressions2.expression.Valor;
import plp.expressions2.expression.ValorInteiro;
import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;
import plp.imperative1.memory.AmbienteCompilacaoImperativa;
import plp.imperative1.memory.AmbienteExecucaoImperativa;

public class Sleep implements Comando {
    
	private static final int MIL = 1000;
    private Valor valor;
    
    public Sleep(Valor valor){
        this.valor = valor;
    }
    
    /**
     * Escreve na saida padr�o.
     *
     * @param ambiente o ambiente de execu��o.
     *
     * @return o ambiente depois de modificado pela execu��o
     * do comando <code>write</code>.
     * @throws InterruptedException 
     *
     */
    public AmbienteExecucaoImperativa executar(AmbienteExecucaoImperativa ambiente) 
        throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException, InterruptedException {
    	Thread.sleep(((ValorInteiro) valor).valor()*MIL);
        return ambiente;
    }

    /**
     * Realiza a verificacao de tipos da express�o a ser escrita na
     * pelo comando <code>write</code>
     *
     * @param ambiente o ambiente de compila��o.
     * @return <code>true</code> se a express�o a ser escrita est� bem tipada;
     *          <code>false</code> caso contrario.
     */
    public boolean checaTipo(AmbienteCompilacaoImperativa ambiente) 
        throws VariavelJaDeclaradaException, VariavelNaoDeclaradaException {
    	//A linguagem já define que é um tipo inteiro
        return true;
    }


}
